home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / 8bit / cislib_a / dskchk.msb < prev    next >
Text File  |  1995-04-22  |  7KB  |  224 lines

  1.  
  2. 10 ! DISK CHECKER - DAVE SMALL 
  3. 13 ! Creative Computing - 
  4. 15 ! May 1982, pp.186-190 
  5. 20 ! 
  6. 30 GOTO 290 
  7. 40 ' SUBROUTINES PLACED IN FRONT 
  8. 50 ' FOR SPEED, NO COMMENTING. 
  9. 60 ! 
  10. 70 ' DISK READ SUBROUTINE 
  11. 80 POKE DCB+1,DFROM 
  12. 90 POKE DCB+2,82 
  13. 100 BHI=INT(BUFF/256):BLO=BUFF-(BHI*256) 
  14. 110 POKE DCB+4,BLO 
  15. 120 POKE DCB+5,BHI 
  16. 130 SHI=INT(RSECTOR/256):SLO=RSECTOR-(SHI*256) 
  17. 140 POKE DCB+10,SLO:POKE DCB+11,SHI 
  18. 150 X=USR(CALL) 
  19. 160 DSTATS=PEEK(DCB+3) 
  20. 170 RETURN 
  21. 180 ' DISK WRITE SUBROUTINE - (SAMPLE) 
  22. 190 POKE DCB+1,DTO 
  23. 200 POKE DCB+2,87 
  24. 210 BHI=INT(BUFF/256):BLO=BUFF-(BHI*256) 
  25. 220 POKE DCB+4,BLO 
  26. 230 POKE DCB+5,BHI 
  27. 240 SHI=INT(RSECTOR/256):SLO=RSECTOR-(SHI*256) 
  28. 250 POKE DCB+10,SLO:POKE DCB+11,SHI 
  29. 260 PRINT "ERROR":GRAPHICS 0 
  30. 270 DSTATS=PEEK(DCB+3) 
  31. 280 RETURN 
  32. 290 REM DISK CHECKER 
  33. 300 ' DOES SECTOR TRACE OF ALL 
  34. 310 ' FILES IN THE DIRECTORY. 
  35. 320 ' PRODUCES LISTING WITH OK/BAD. 
  36. 330 ! 
  37. 340 ' ASSUMES 48K, MICROSOFT. 
  38. 350 ! 
  39. 360 ' GET DISK NUMBER, WELCOME.--- 
  40. 370 GRAPHICS 0:SETCOLOR 8,9,4:POKE 82,0:POKE 83,39 
  41. 380 CLEAR 
  42. 390 PRINT "          DISK CHECKER          " 
  43. 400 PRINT:PRINT "INPUT DRIVE NUMBER"; 
  44. 410 INPUT DF$ 
  45. 420 IF DF$="" THEN DFROM=1:GOTO 440 
  46. 430 DFROM=VAL(DF$) 
  47. 440 DTO=DFROM 
  48. 450 CALL=&E453  !DSKINV ADDRESS 
  49. 460 ! NOTE: MICROSOFT CAN CALL 
  50. 470 ! DSKINV$ DIRECTLY, NO PLA 
  51. 480 ! NEEDED 
  52. 490 DCB=&300 
  53. 500 OPTION RESERVE 20*128 
  54. 510 B=VARPTR(RESERVE) 
  55. 520 IF B<0 THEN B=B+65536 
  56. 530 ! FIRST, READ IN DIRECTORY---- 
  57. 540 PRINT "GETTING DIRECTORY." 
  58. 550 INCR=0 
  59. 560 FOR RSECTOR=360 TO 368 
  60. 570 BUFF=B+(128*INCR)  !INPUT AREA 
  61. 580 GOSUB 70           !GET SECTOR 
  62. 590 IF DSTATS=1 THEN 630 
  63. 600 PRINT "***DISK RETRY,DIRECTORY SECTOR ";RSECTOR 
  64. 610 PRINT "***STATUS =";DSTATS 
  65. 620 GOTO 570 
  66. 630 INCR=INCR+1 
  67. 640 PRINT INCR 
  68. 650 NEXT RSECTOR 
  69. 660 PRINT 
  70. 670 PRINT "WAIT -- BUILDING TABLES." 
  71. 680 ! OK, NOW EXAMINE DIRECTORY. 
  72. 690 !     PRODUCE LISTING FIRST OFF. 
  73. 700 !NOTE 360=VTOC, NOT DIR. 
  74. 710 DIM INFO(64,6)     ! FILE INFO 
  75. 720 DIM NIME$(64)      ! NAME INFO 
  76. 730 DIM DEAD(64)       ! FILE BOMBED? 
  77. 740 FOR Z%=1 TO 64:DEAD(Z%)=0:NEXT Z% 
  78. 750 ' 
  79. 760 Z=B+128    ! START OF DIR ENTRY 
  80. 770 ! BUILD FLAG AND INFO TABLE 
  81. 780 FNUM=1 
  82. 790 FOR LOC=Z TO Z+(64*16) STEP 16 
  83. 800 ! LOC=ENTRIES' STARTING ADDR 
  84. 810 FLAG%=PEEK(LOC) 
  85. 820 IF(FLAG% AND &80)=&80 THEN INFO(FNUM,3)=1 
  86. 830 IF(FLAG% AND &40)=&40 THEN INFO(FNUM,4)=1 
  87. 840 IF(FLAG% AND &20)=&20 THEN INFO(FNUM,5)=1 
  88. 850 IF (FLAG% AND 1)=1 THEN INFO(NUM,6)=1 
  89. 860 ! SECTOR INFO----------------------- 
  90. 870 INFO(FNUM,1)=PEEK(LOC+1)+256*PEEK(LOC+2) 
  91. 880 INFO(FNUM,2)=PEEK(LOC+3)+256*PEEK(LOC+4) 
  92. 890 ! NOW GET NAME DATA..--------------- 
  93. 900 NIME$(FNUM)="" 
  94. 910 FOR Z%=5 TO 15 
  95. 920 NIME$(FNUM)=NIME$(FNUM)+CHR$(PEEK(LOC+Z%)) 
  96. 930 NEXT Z% 
  97. 940 ! CHECK FOR END OF ENTRIES 
  98. 950 IF PEEK(LOC+5)=0 THEN 1020 
  99. 960 ! 
  100. 970 FNUM=FNUM+1 
  101. 980 IF FNUM/5=INT(FNUM/5) THEN PRINT FNUM; 
  102. 990 NEXT LOC 
  103. 1000 PRINT "DIR TOTALLY FULL." 
  104. 1010 GOTO 1030 
  105. 1020 PRINT "DIR PARTLY FULL." 
  106. 1030 FNUM=FNUM-1 
  107. 1040 PRINT 
  108. 1050 PRINT "NUMBER OF ENTRIES =";FNUM 
  109. 1060 ! OUTPUT DIRECTORY 
  110. 1070 ! ENTRY POINT FROM BELOW 
  111. 1080 IF FNUM=0 THEN 1320 ! EMPTY DISK 
  112. 1090 PRINT 
  113. 1100 PRINT "  D=DELETED / U=USED / L=LOCKED / O=OPEN" 
  114. 1110 PRINT " SC=SECTOR COUNT(LEN)" 
  115. 1120 PRINT " SS=STARTING SECTOR" 
  116. 1130 PRINT " +=GOOD FILE-=BAD FILE ?=UNKNOWN" 
  117. 1140 PRINT 
  118. 1150 FOR F=1 TO FNUM 
  119. 1160 PRINT USING "##";F; 
  120. 1170 IF DEAD(F)=-1 THEN PRINT "+"; 
  121. 1180 IF DEAD(F)=1 THEN PRINT "-"; 
  122. 1190 IF DEAD(F)=0 THEN PRINT "?"; 
  123. 1200 PRINT "!";NIME$(F);"!"; 
  124. 1210 IF INFO(F,3)=1 THEN PRINT "D"; ELSE PRINT " "; 
  125. 1220 IF INFO(F,4)=1 THEN PRINT "U"; ELSE PRINT " "; 
  126. 1230 IF INFO(F,5)=1 THEN PRINT "L"; ELSE PRINT " "; 
  127. 1240 IF INFO(F,6)=1 THEN PRINT "O"; ELSE PRINT " "; 
  128. 1250 PRINT "!SC:"; 
  129. 1260 PRINT USING "###";INFO(F,1); 
  130. 1270 PRINT "!SS:"; 
  131. 1280 PRINT USING "###";INFO(F,2) 
  132. 1290 IF F/20=INT(F/20) THEN INPUT RET$ 
  133. 1300 NEXT F 
  134. 1310 GOTO 1390 
  135. 1320 PRINT "EMPTY DISK -- NO ENTRIES" 
  136. 1330 STOP 
  137. 1340 PRINT 
  138. 1350 ! ENTRY POINT (BELOW) 
  139. 1360 PRINT "PRESS RETURN." 
  140. 1370 INPUT RET$:CLS:GOTO 1420 
  141. 1380 GOTO 1400 
  142. 1390 PRINT "PRESS RETURN." 
  143. 1400 INPUT RET$ 
  144. 1410 ! NEXT IS ENTRY POINT 
  145. 1420 PRINT "}SELECT : 
  146. 1430 PRINT "1. 'n' A FILE NUMBER TO CHECK." 
  147. 1440 PRINT "2. 'A' TO CHECK ALL FILES." 
  148. 1450 PRINT "3. 'D' TO SEE DIRECTORY LIST AGAIN." 
  149. 1460 PRINT "NOTE: ERRORS SHOW UP ON DIR LISTING" 
  150. 1470 PRINT "      AFTER THEY OCCUR IN SEARCH." 
  151. 1480 INPUT N$ 
  152. 1490 IF N$="A" THEN FILE=128:GOTO 1690 
  153. 1500 IF N$="D" THEN GRAPHICS 0:GOTO 1070 
  154. 1510 ON ERROR 1540 
  155. 1520 FILE=VAL(N$) 
  156. 1530 GOTO 1560 
  157. 1540 PRINT "ERROR. RE-ENTER." 
  158. 1550 RESUME 1420 
  159. 1560 ! --- PROCESS. CHECK. 
  160. 1570 IF FILE>FNUM OR FILE<0 OR FILE<>INT(FILE) THEN PRINT "ERROR.":GOTO 1420 
  161. 1580 ! SINGLE ENTRY HANDLER 
  162. 1590 PRINT "TRACING--'SELECT' TO ABORT." 
  163. 1600 SS=INFO(FILE,2)   ! STARTING SECT 
  164. 1610 SC=INFO(FILE,1)   ! SECTOR COUNT 
  165. 1620 RSECTOR =SS 
  166. 1630 ! GO TRACE IT...ARROR=RETURN 
  167. 1640 GOSUB 1850 
  168. 1650 IF ARROR=1 THEN PRINT "***BAD FILE***" 
  169. 1660 IF ARROR=1 THEN DEAD(FILE)=1 ELSE DEAD(FILE)=-1 
  170. 1670 GOSUB 2110        ! MARK FILE NAME 
  171. 1680 GOTO 1350 
  172. 1690 ! ALL ENTRIES HANDLER 
  173. 1700 FOR FILE=1 TO FNUM 
  174. 1710 CLS 
  175. 1720 PRINT "TRACING FILE #";FILE 
  176. 1730 IF LP=1 THEN PRINT #3,"TRACING FILE #";FILE 
  177. 1740 PRINT "PRESS 'SELECT' TO ABORT." 
  178. 1750 SS=INFO(FILE,2) ! STARTING SECT 
  179. 1760 SC=INFO(FILE,1) ! SECTOR COUNT 
  180. 1770 RSECTOR=SS 
  181. 1780 GOSUB 1850 
  182. 1790 IF ARROR=1 THEN PRINT "***BAD FILE***" **" 
  183. 1800 IF ARROR=1 THEN DEAD(FILE)=1 ELSE DEAD(FILE)=-1 
  184. 1810 GOSUB 2110 
  185. 1820 NEXT FILE 
  186. 1830 PRINT "COMPLETED." 
  187. 1840 GOTO 1350 
  188. 1850 ! TRACING SUBROUTINE 
  189. 1860 ARROR=0 
  190. 1870 PRINT 
  191. 1880 PRINT "---SEC CNT=";SC;" READING SEC ";RSECTOR 
  192. 1890 POKE &D01F,0      ' CLEAR BUTTONS 
  193. 1900 GOSUB 70          'READ 
  194. 1910 ! CHECK BUTTONS 
  195. 1920 IF PEEK(&D01F)<>7 THEN RETURN 
  196. 1930 IF DSTATS=1 THEN 1960 
  197. 1940 PRINT "+++ERROR. DSTATS=";DSTATS;" ON SECTOR ";RSECTOR 
  198. 1950 GOTO 1900         'RETRY 
  199. 1960 IF SC=0 THEN RETURN 
  200. 1970 SC=SC-1           ! DECR S COUNT 
  201. 1980 ! GET FORWARD POINTER + FNUM 
  202. 1990 FWD=(PEEK(BUFF+125) AND 3)*256 
  203. 2000 FWD=FWD+PEEK(BUFF+126) 
  204. 2010 FN=INT((PEEK(BUFF+125) AND &FC)/4) ! HENCE, SHIFTED 2 BITS RIGHT 
  205. 2020 FN=FN+1   ! (DISK STARTS AT 0) 
  206. 2030 PRINT "---DATA: FILE NUM=";FN;"  FWD SEC =";FWD 
  207. 2040 IF FN<>FILE THEN PRINT "FILE NUMBER ERROR.":ARROR=1 
  208. 2050 IF FWD>720 OR FWD<0 THEN PRINT "FORWARD PTR OUT OF RANGE, ABORT.:ARROR=1:RETURN 
  209. 2060 IF FWD=0 THEN 2090 
  210. 2070 RSECTOR=FWD 
  211. 2080 GOTO 1870 
  212. 2090 PRINT "COMPLETED." 
  213. 2100 RETURN 
  214. 2110 ! MARK A FILE AS BAD IN NAME. 
  215. 2120 ! SET HIGH BIT SO IT SHOWS 
  216. 2130 ! UP IN INVERSE VODEO.. 
  217. 2140 IF ARROR=0 THEN RETURN 
  218. 2150 Z$=NIME$(FILE) 
  219. 2160 NIME$(FILE)="" 
  220. 2170 FOR Z=1 TO LEN(Z$) 
  221. 2180 NIME$(FILE)=NIME$(FILE)+CHR$((ASC(MID$(Z$,Z,1)) OR &80))  ! SET HIGH BIT 
  222. 2190 NEXT Z 
  223. 2200 RETURN 
  224.